// 异步线程池
function timeout(time) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, time);
  });
}

class SuperTask {
  constructor(parallelCount = 2) {
    this.parallelCount = parallelCount; // 并发数量
    this.tasks = [];
    this.runningCount = 0;
  }
  add(task) {
    return new Promise((resolve, reject) => {
      this.tasks.push({
        task,
        resolve,
        reject
      });
      this._run(); // 没有正在执行的任务，就立即执行任务
    });
  }
  _run() {
    while (this.runningCount < this.parallelCount && this.tasks.length > 0) {
      let { task, resolve, reject } = this.tasks.shift();
      this.runningCount++;
      task().then(resolve, reject).finally(() => {
        this.runningCount--;
        this._run();
      });
    }
  }
}

const superTask = new SuperTask();
function addTask(time, name) {
  superTask.add(() => timeout(time))
  .then(() => {
    console.log(`任务${name}完成`);
  });
}

addTask(10000, 1); // 10s后打印：任务1完成
addTask(5000, 2); // 5s后打印：任务2完成
addTask(3000, 3); // 8s后打印：任务3完成
addTask(4000, 4); // 12s后打印：任务4完成
addTask(5000, 5); // 15s后打印：任务5完成
